package adke;

import adke.managers.GameManager;
import adke.models.powerups.Powerup;
import info.clearthought.layout.TableLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Point;
import java.awt.Transparency;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.StringTokenizer;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JComponent;
import javax.swing.JPanel;

public class Util
{
    public static int[] splitResolutionSetting(String setting)
    {
        int x, y;
        StringTokenizer st = new StringTokenizer(setting, "x");
        x = Integer.parseInt(st.nextToken());
        y = Integer.parseInt(st.nextToken());
        return new int[]{x, y};
    }
    
    public static int random(int order)
    {
        return (int)(Math.random() * order);
    }
    
    public static double random(double order)
    {
        return (Math.random() * order);
    }
    
    // dx dy voor een bepaalde snelheid in pix voor gegeven hoek
    public static double[] calculateNewPointDiff(double direction, double speed)
    {
        // http://nl.wikipedia.org/wiki/Eenheidscirkel
        double nDy = Math.sin(Math.toRadians(direction));
        double nDx = Math.cos(Math.toRadians(direction)); 
        
        return new double[]{nDx*speed, nDy*speed};
    }
    
    // maak de text representatie van de variable VK_KEY
    public static String keyToString(int key)
    {
        return KeyEvent.getKeyText(key);
    }
    
    // een plaatje dat aangeeft dat we er nog geen plaatje voor hebben
    public static Image getEmptyImage()
    {
        int dimension = Powerup.IMG_DIMENSION;
        
        BufferedImage bimage = new BufferedImage(dimension, dimension, BufferedImage.TYPE_INT_ARGB);
        Graphics g = bimage.getGraphics();
        g.setColor(Color.RED);
        
        // kruis
        g.drawLine(0, 0, bimage.getWidth(), bimage.getHeight());
        g.drawLine(bimage.getWidth(), 0, 0, bimage.getHeight());
        
        // vierkant
        g.drawRect(1, 1, dimension-2, dimension-2);
        
        // schijnbaar kan de garbage collector dit niet
        g.dispose();
        
        return bimage;
    }
    
    public static String getLogTimeString(int time)
    {
        return "[" + time + "] ";
    }
    
    public static String getLogTimeString()
    {
        return getLogTimeString(GameManager.getGameTime());
    }
    
    // http://forums.sun.com/thread.jspa?threadID=5343141
    public static BufferedImage optimizeImage(BufferedImage img)
    {
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();				
        GraphicsConfiguration gc = gd.getDefaultConfiguration();

        boolean istransparent = img.getColorModel().hasAlpha();

        BufferedImage img2 = gc.createCompatibleImage(img.getWidth(), img.getHeight(), istransparent ? Transparency.BITMASK : Transparency.OPAQUE);
        Graphics2D g = img2.createGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();

        return img2;
    }

    public static void notify(final long delay, final Runnable action)
    {
        TimerTask tt = new TimerTask()
        {
            public void run()
            {
                try
                {
                    Thread.sleep(delay);
                } 
                catch (InterruptedException ex)
                {
                    ex.printStackTrace();
                }
                
                // laat deze maar een enkele keer lopen
                cancel();
                
                action.run();
            }
        };
        
        Timer timer = new Timer();
        timer.schedule(tt, 0);
    }
    
    // er zit/zat een bug in de validatie van spelers.
    // als er een speler dood ging werd soms een verkeerde kleur
    // van de killer teruggegeven (0R, 243G, 243B ipv lichtblauw bijv)
    // als workaround kunnen we kijken welk van de kleuren van de spelers
    // het dichts in de buurt komt van de gegeven kleur, en aan hem de punten toekennen
    public static int getColorRelativity(Color color1, Color color2)
    {
        int[][] difTable = new int[2][3];
        
        // zet even beide RGB waarden naast elkaar
        difTable[0][0] = color1.getRed();
        difTable[0][1] = color1.getBlue();
        difTable[0][2] = color1.getGreen();
        
        difTable[1][0] = color2.getRed();
        difTable[1][1] = color2.getBlue();
        difTable[1][2] = color2.getGreen();
        
        int dif = 0;
        
        for (int i = 0; i < 3; i++)
        {
            // zorg dat de grootste waarden in [0] staan
            if (difTable[1][i] > difTable[0][i])
            {
                int tmp = difTable[0][i];
                difTable[0][i] = difTable[1][i];
                difTable[1][i] = tmp;
            }
            
            // reken het verschil uit
            dif = dif + difTable[0][i] - difTable[1][i];
        }
        
        return dif;
    }
}
